#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // 用于max
using namespace std; 

// 求最长公共子序列
int LCS(const string& x, const string& y) {
    // 创建备忘录，求解重叠子问题
    // 令dp[i][j] 为 x[0..i-1](也就是前i个字符) 与 y[0..j-1]
    // (也就是前j个字符)的LCS长度
    vector<vector<int>> dp(x.size() + 1, vector<int>(y.size() + 1, 0));

    for (int i = 1; i <= x.size(); i++) {
        for (int j = 1; j <= y.size(); j++) {
            // 分支1：两个子串的末尾字符相等
            if (x[i - 1] == y[j - 1]) {
                dp[i][j] = 1 + dp[i - 1][j - 1];
            }
            // 分支2：末尾字符不相等
            else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    // 返回结果
    return dp[x.size()][y.size()];
}

int main() {
    string x = "abcd", y = "acedb";
    int len = LCS(x, y);
    cout << "最长公共子序列长度为: " << len << endl;
    return 0;
}